<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title></title>
  </head>
  <body>
    <script type="text/javascript">
    console.log ("=========参数==========");
    function f1(x){
      return x * x;
    }

    console.log (f1(2));
    console.log (f1(3));

    function f2(a,b){

    }
    f2('a','b','c');
    console.log (f2.length);

    console.log ("=========传递方式 - 传值传递==========");
    //函数参数如果是原始类型的值（数值，字符，布尔型）,
    //传递方式是传值传递（passes by value).
    //这意味着，在函数体内修改参数值，不会影响到函数外部。
    var a = 2;

    function f3(a){
      a = 3;
      return a;
    }

    console.log (f3(a) + '  ' +a);

    console.log ("=========传递方式 - 地址传递==========");
    var obj = {
      name : 1,
    };

    function f4(o){
      o.name = 2;
      o.age = 18;
    }

    f4(obj);

    console.log(obj.name);

    console.log ("==========传递方式 - 地址传递==========");
    //注意，如果函数内部修改的，
    //不是参数对象的某个属性，而是替换掉整个参数，这时不会影响到原始值。

    var arr = [1,2,3];

    function f5(b){
      arr = [2,3,4];
    }

    f5(arr);

    console.log (arr);

    console.log ("========== 同名参数 ==========");
    //如果有同名胡参数，则取最后的那个值。

    function f6(a,a){
      return a;
    }

    console.log (f6(2,3));

    console.log ("========== arguments对象 ==========");

    var num = function (a,b,c){
    console.log (arguments[0]);
    console.log (arguments[1]);
    console.log (arguments[2]);
    }

    num(1,2,3);


    console.log ("========== 闭包 ==========");

    function f7(){
      var n = 99;
      function f8(n){
      console.log(n);
    }

    return f8(n);
   }

    f7();
    </script>
  </body>
</html>
